"""
面向对象的第三个要素-多态
"""
"""
多态的定义-
    java的定义调用相同的方法，不同的对象的到不同的结果。这就是多态
        实现方式：方法的重载和方法的重写
            方法的重写-要有继承，要有方法的重写，父类引用指向子类对象
            方法的重载-同一个方法，参数位置不同，参数个数不同，参数类型不同会导致方法不同
    python定义多态和java一样
        在定义参数时候，不需要考虑参数的类型。只要满足要求都能使用该方法
        len函数为什么查看所有类型的长度 底层实现__len__这个魔术方法的在不同类的重写
"""


class A():
    def __init__(self, name, age):
        self._name = name
        self._age = age

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, age):
        self._age = age


class B():
    def __init__(self, name, age):
        self._name = name
        self._age = age

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, age):
        self._age = age


class C():
    def __init__(self, age):
        self._age = age

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, age):
        self._age = age


def say_hello(obj):
    print("你好，我是%s" % obj.name)


# 多态的实现 方法say_hello不考虑参数，只考虑有没有name属性。有属性就打印，没属性就报错
a = A("张三", 11)
say_hello(a)
b = B("李四", 12)
say_hello(b)
c = C(12)
# say_hello()
